chmod関数は、ファイルやディレクトリ(フォルダ)のアクセス許可情報(パーミッション)を変更します。なお、この機能を使うには、実行プロセスがアクセス許可情報を変更できる権限を持っていることが必要です。
この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。
try these out
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
*pathは変更するファイルのパス名を指定します。
modeは許可情報を指定します。
戻り値として、処理が成功した場合は0を、失敗した場合は-1を返します。
第2引数のmodeは、次の値のORをとったもので指定します。
| モード | 意味 |
|---|---|
| S_ISUID | 04000:実行時のセット・ユーザー・ID(set user ID)。 |
| S_ISGID | 02000:実行時のセット・グループ・ID(set group ID)。 |
| S_ISVTX | 01000:スティッキー(sticky)ビット。 |
| S_IRUSR | 00400:所有者(owner)による読み取り(read)。 |
| S_IWUSR | 00200:所有者による書き込み(write)。 |
| S_IXUSR | 00100:所有者による実行(execute)・検索(search)。 |
| S_IRGRP | 00040:グループ(group)による読み取り。 |
| S_IWGRP | 00020:グループによる書き込み。 |
| S_IXGRP | 00010:グループによる実行・検索。 |
| S_IROTH | 00004:他人(others)による読み取り。 |
| S_IWOTH | 00002:他人による書き込み。 |
| S_IXOTH | 00001:他人による実行・検索。 |
プログラム 例
#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char **argv)
{
char ans;
int return_code = 0;
if (argc == 2) {
printf('%sに実行許可を与えます。よろしいですか(y/n)==> ', *(argv+1));
scanf('%c', &ans);
if (ans == 'y' || ans == 'Y') {
/* 所有者・グループ・他人による実行を許可 */
if (chmod(*(argv+1),
S_IRUSR | S_IWUSR | S_IXUSR | /* rwx */
S_IRGRP | S_IXGRP | /* r-x */
S_IROTH | S_IXOTH) == 0) { /* r-x */
printf('実行許可を与えました\n');
}
else {
printf('実行許可を与えられませんでした\n');
perror('');
return_code = 1;
}
}
else {
printf('キャンセルします\n');
}
}
else {
printf('実行時引数の数が不当です\n');
return_code = 2;
}
return return_code;
}
例の実行結果
$ cd DIR1 $ ls -l 合計 8 -rw-r--r-- 1 user users 39 2008-07-29 10:13 hello_1.sh -rw-r--r-- 1 root root 39 2008-07-29 10:43 hello_2.sh $ ./hello_1.sh bash: ./hello_1.sh: 許可がありません $ $ cd .. $ ./chmod.exe ./DIR1/hello_1.sh ./DIR1/hello_1.shに実行許可を与えます。よろしいですか(y/n)==> y 実行許可を与えました $ $ cd DIR1 $ ls -l 合計 8 -rwxr-xr-x 1 user users 39 2008-07-29 10:13 hello_1.sh -rw-r--r-- 1 root root 39 2008-07-29 10:43 hello_2.sh $ ./hello_1.sh Hello. bye. $ $ cd .. $ ./chmod.exe ./DIR1/hello_2.sh ./DIR1/hello_2.shに実行許可を与えます。よろしいですか(y/n)==> y 実行許可を与えられませんでした Operation not permitted $